package com.tony.juc;

import java.util.concurrent.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @Title: CompletionServiceDemo001
 * @Auther: 皮蛋布丁
 * @Date: 2022/04/17/19:57
 * @Description: 异步获取数据项
 */
public class CompletionServiceDemo001 {
    public static void main(String[] args) throws Exception {
        //此时的线程池的大小为2，所以每一次只有2个线程任务可以被调度，而后被调度执行完成的线程处理结果
        //会自动的保存再结果的阻塞队列之中，后面可以交由其他线程通过此阻塞队列获取数据，从而实现异步数据的访问功能
        ExecutorService service = Executors.newFixedThreadPool(2); //创建2个大小线程池
        //现在的线程池统一被CompletionService实例所管理，所有线程任务交友此接口实例操作
        CompletionService<String> completionService = new ExecutorCompletionService<>(service);
        for (int i = 0; i < 5; i++) {
            completionService.submit(new CompletionServiceTaskItem()); //提交线程任务
        }
        for (int i = 0; i < 10; i++) {
            System.err.println(completionService.take().get());//获取执行结果
        }
        service.shutdownNow();//关闭线程池


    }
}
class CompletionServiceTaskItem implements Callable<String> { //定义线程任务

    @Override
    public String call() throws Exception {
        long start = System.currentTimeMillis(); //开始时间
        TimeUnit.SECONDS.sleep(1); //模拟操作延迟
        long end = System.currentTimeMillis(); //结束时间
        return String.format("【%s】皮蛋布丁任务执行完毕，任务的耗时时间为:%d",Thread.currentThread().getName(),(end - start));
    }
}
